import { type UserConfig, type ConfigEnv, loadEnv, defineConfig } from "vite";

// import { fileURLToPath, URL } from "node:url";

import path from "path";

import vue from "@vitejs/plugin-vue";

import AutoImport from "unplugin-auto-import/vite";
import Components from "unplugin-vue-components/vite";
import { ElementPlusResolver } from "unplugin-vue-components/resolvers";

/** 参考Vite官方配置: https://cn.vitejs.dev/config */
export default defineConfig(({ mode }: ConfigEnv): UserConfig => {
  const env = loadEnv(mode, process.cwd());
  return {
    plugins: [
      vue(),
      AutoImport({
      resolvers: [ElementPlusResolver()],
      imports: ['vue'], // 自动导入 Vue 相关函数
      dts: 'src/auto-imports.d.ts' // 生成自动导入的类型声明文件
    }),
    Components({
      resolvers: [ElementPlusResolver()],
      dts: 'src/components.d.ts' // 生成组件类型声明文件
    }),
    ], // 必须注册插件
    //配置别名
    resolve: {
      alias: {
        "@": path.resolve(__dirname, "./src"),
      },
    },

    server: {
      host: "0.0.0.0", // 允许IP访问
      port: Number(env.VITE_APP_PORT), // 应用端口
      open: true, // 运行是否自动打开浏览器
      proxy: {
        /** 接口代理解决跨域 */
        [env.VITE_APP_BASE_API]: {
          changeOrigin: true,
          target: env.VITE_APP_TARGET_URL, // https://api.xxx.com
          rewrite: (path) =>
            path.replace(
              new RegExp("^" + env.VITE_APP_BASE_API), // ^/api
              env.VITE_APP_TARGET_BASE_API // ""
            ), // 将 /api 开头的请求转发至 target
        },
        // "/api": {
        //   target: "http://localhost:3000",
        //   changeOrigin: true,
        //   rewrite: (path) => path.replace(/^\/api/, ""),
        // },
      },
    },
    // 构建
    build: {
      minify: false, // 禁用压缩调试
      emptyOutDir: true, // 打包时先清空上一次构建生成的目录
      // outDir: "distp", //指定输出路径
      // assetsDir: "static/img/", // 指定生成静态资源的存放路径
      chunkSizeWarningLimit: 2000, // 消除打包大小超过500kb警告
      // minify: "terser", // Vite 2.6.x 以上需要配置 minify: "terser", terserOptions 才能生效
      terserOptions: {
        // compress: {
        //   keep_infinity: true, // 防止 Infinity 被压缩成 1/0，这可能会导致 Chrome 上的性能问题
        //   drop_console: true, // 生产环境去除 console
        //   drop_debugger: true, // 生产环境去除 debugger
        // },
        // format: {
        //   comments: false, // 删除注释
        // },
      },
      rollupOptions: {
        //体积太大，模块拆分
        output: {
          manualChunks(id) {
            if (id.includes("node_modules")) {
              return id
                .toString()
                .split("node_modules/")[1]
                .split("/")[0]
                .toString();
            }
          },
          // 用于从入口点创建的块的打包输出格式[name]表示文件名,[hash]表示该文件内容hash值
          entryFileNames: "static/js/[name]-[hash].js",

          // 用于命名代码拆分时创建的共享块的输出命名
          chunkFileNames: "static/js/[name]-[hash].js", //js文件放到一个文件夹
          // chunkFileNames: (chunkInfo) => { // 拆分js到对应模块文件夹
          //   const facadeModuleId = chunkInfo.facadeModuleId
          //     ? chunkInfo.facadeModuleId.split("/")
          //     : [];
          //   const fileName =
          //     facadeModuleId[facadeModuleId.length - 2] || "[name]";
          //   return `static/js/${fileName}/[name].[hash].js`;
          // },

          // 用于输出静态资源的命名，[ext]表示文件扩展名
          // assetFileNames: "static/[ext]/[name]-[hash].[ext]",  //根据拓展名拆分文件夹
          assetFileNames: (assetInfo) => {
            //根据类型拆分文件夹
            var info = assetInfo.name!.split(".");
            var extType = info[info.length - 1];
            if (
              /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/i.test(assetInfo.name!)
            ) {
              extType = "media";
            } else if (/\.(png|jpe?g|gif|svg)(\?.*)?$/.test(assetInfo.name!)) {
              extType = "img";
            } else if (
              /\.(woff2?|eot|ttf|otf)(\?.*)?$/i.test(assetInfo.name!)
            ) {
              extType = "fonts";
            }
            return `static/${extType}/[name]-[hash][extname]`;
          },
        },
      },
    },
  };
});
